package feizhou.untils.tools;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.ArrayUtils;

import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;

/**
 * @Auther: yejin
 * @Date: 2019/2/26 10:52
 * @Description: 随机获取工具类。
 */
public class RandomUtils {
    private static Random random;

    /**
     * 获取Random单例。
     *
     * @return
     */
    public static Random getRandom() {
        if (null == random) {
            synchronized (RandomUtils.class) {
                if (null == random) {
                    random = new Random();
                }
            }
        }
        return random;
    }

    /**
     * 获得一个[0,max)之间的整数。
     *
     * @param max
     * @return
     */
    public static int getRandomInt(int max) {
        return Math.abs(getRandom().nextInt()) % max;
    }

    /**
     * 获得一个[0,max)之间的整数。
     *
     * @param max
     * @return
     */
    public static long getRandomLong(long max) {
        return Math.abs(getRandom().nextInt()) % max;
    }

    /**
     * 从数组中随机获取一个元素。
     *
     * @param arr
     * @param <T>
     * @return
     */
    public static <T> T getRandomArr(T[] arr) {
        if(ArrayUtils.isEmpty(arr))
            return null;
        List<T> ts = Arrays.asList(arr);
        return getRandomElement(ts);
    }

    /**
     * 从集合中随机取得一个元素。
     *
     * @param list
     * @return
     */
    public static <T> T getRandomElement(Collection<T> list) {
        if (CollectionUtils.isEmpty(list))
            return null;
        // 去除空元素
        delNullEle(list);

        // list的长度内随机一个数字
        int rn = getRandomInt(list.size());
        int i = 0;

        for (T t : list) {
            if (i == rn)
                return t;
            i++;
        }
        return null;
    }

    /**
     * 删除集合中空元素。
     *
     * @param list
     * @param <T>
     */
    private static <T> void delNullEle(Collection<T> list) {
        if(CollectionUtils.isEmpty(list))
            return;
        Iterator<T> it = list.iterator();
        while (it.hasNext()) {
            T t = it.next();
            if(null == t)
                it.remove();
        }
    }

    /**
     * 从map中随机取得一个key。
     *
     * @param map
     * @return
     */
    public static <K, V> K getRandomKeyFromMap(Map<K, V> map) {
        if (null == map || CollectionUtils.isEmpty(map.keySet()))
            return null;
        return getRandomElement(map.keySet());
    }

    /**
     * 从map中随机取得一个value。
     *
     * @param map
     * @return
     */
    public static <K, V> V getRandomValueFromMap(Map<K, V> map) {
        if (null == map || CollectionUtils.isEmpty(map.values()))
            return null;
        return getRandomElement(map.values());
    }

    public static void main(String[] args) {
        // 方法测试
    }
}
